---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
      name:  <unnamed>
       log:  /Users/jesse/Dropbox/voter_id/Replication/table6.log
  log type:  text
 opened on:  17 Aug 2020, 12:42:31

. 
. use "$path/nc_dataset.dta" if new_reg == 0, clear

. 
. drop new_reg noid_p_2016 dem rep

. 
. // drop 2018 
. drop if inlist(election, 11, 12)
(13,254,638 observations deleted)

. 
. sort id election

. 
. replace voted = 0 if voted == .
(0 real changes made)

. 
. // replace voted with NA if under 18 / ineligible in that election year 
. drop if birth_year > 1998 & birth_year < 9999
(70 observations deleted)

. replace voted = . if (birth_year > 1990 & birth_year < 9999) & (election == 1 | election == 2) // 2008
(1,102,090 real changes made, 1,102,090 to missing)

. replace voted = . if (birth_year > 1992 & birth_year < 9999) & (election == 3 | election == 4) // 2010
(680,176 real changes made, 680,176 to missing)

. replace voted = . if (birth_year > 1994 & birth_year < 9999) & (election == 5 | election == 6) // 2012
(269,954 real changes made, 269,954 to missing)

. replace voted = . if (birth_year > 1996 & birth_year < 9999) & (election == 7 | election == 8) // 2014
(314 real changes made, 314 to missing)

. 
. ** create string encoding of possible pre-treatment outcome paths
. tostring voted, generate(outcome_path)
outcome_path generated as str1

. 
. by id: gen outcome_path_pretreat = outcome_path[1] + outcome_path[2] + ///
>                                                                 outcome_path[3] + outcome_path[4] + ///
>                                                                 outcome_path[5] + outcome_path[6] + ///
>                                                                 outcome_path[7] + outcome_path[8]

. 
. gen count = 1

. 
. // keep generals only
. keep if mod(election,2) == 0
(33,136,560 observations deleted)

. 
. // generate race interactions
. replace black = 0 if black == .
(687,520 real changes made)

. replace hispanic = 0 if hispanic == .
(0 real changes made)

. replace othernw = 0 if othernw == .
(687,520 real changes made)

. gen treat_black = treat * black

. gen treat_hispanic = treat * hispanic 

. gen treat_othernw = treat * othernw

. gen no_dmv_black = no_dmv_match * black 

. gen no_dmv_hispanic = no_dmv_match * hispanic

. gen no_dmv_othernw = no_dmv_match * othernw

. 
. replace voted = 0 if voted == .
(1,026,267 real changes made)

. 
. // construct age bins, give young voters who are ineligible for some election their own age bin
. gen age_bin = 11 if (birth_year > 1990 & birth_year < 9999)
(30,381,335 missing values generated)

. replace age_bin = 12 if (birth_year > 1992 & birth_year < 9999)
(1,700,440 real changes made)

. replace age_bin = 13 if (birth_year > 1994 & birth_year < 9999)
(674,885 real changes made)

. replace age_bin = 14 if (birth_year > 1996 & birth_year < 9999)
(785 real changes made)

. // give those who are eligible over the whole period their own age decile
. xtile age_decile = birth_year if (birth_year <= 1990), nq(10)

. replace age_bin = age_decile if (birth_year <= 1990)
(30,334,280 real changes made)

. drop age_decile

. 
. compress
  variable count was float now byte
  variable treat_black was float now byte
  variable treat_hispanic was float now byte
  variable treat_othernw was float now byte
  variable no_dmv_black was float now byte
  variable no_dmv_hispanic was float now byte
  variable no_dmv_othernw was float now byte
  variable age_bin was float now byte
  (795,277,440 bytes saved)

. 
. sort id election

. 
. 
. * vanilla diff in diff
. reghdfe voted treat treat_black treat_hispanic treat_othernw, a(id election) cluster(id)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,136,560
Absorbing 2 HDFE groups                           F(   4,6627311) =    5399.82
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6024
                                                  Adj R-squared   =     0.5030
                                                  Within R-sq.    =     0.0007
Number of clusters (id)      =  6,627,312         Root MSE        =     0.3511

                               (Std. Err. adjusted for 6,627,312 clusters in id)
--------------------------------------------------------------------------------
               |               Robust
         voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
---------------+----------------------------------------------------------------
         treat |  -.1213247   .0011245  -107.89   0.000    -.1235288   -.1191206
   treat_black |  -.0026262   .0016986    -1.55   0.122    -.0059554    .0007029
treat_hispanic |   .0573865   .0040437    14.19   0.000      .049461     .065312
 treat_othernw |   .0132642   .0036331     3.65   0.000     .0061435    .0203849
--------------------------------------------------------------------------------

Absorbed degrees of freedom:
-----------------------------------------------------------------+
   Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
---------------+-------------------------------------------------|
            id |            0         6627312        6627312 *   | 
      election |            4               5              1     | 
-----------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b1 = _b[treat]

. local se1 = _se[treat]

. local b1_2 = _b[treat_black]

. local se1_2 = _se[treat_black]

. local b1_3 = _b[treat_hispanic]

. local se1_3 = _se[treat_hispanic]

. local b1_4 = _b[treat_othernw]

. local se1_4 = _se[treat_othernw]

. local n1 = e(N)

. local nclust1 = e(N_clust)

. 
. * race by year
. reghdfe voted treat treat_black treat_hispanic treat_othernw, a(id race_by_year) cluster(id)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,136,560
Absorbing 2 HDFE groups                           F(   4,6627311) =    5606.59
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6034
                                                  Adj R-squared   =     0.5042
                                                  Within R-sq.    =     0.0008
Number of clusters (id)      =  6,627,312         Root MSE        =     0.3507

                               (Std. Err. adjusted for 6,627,312 clusters in id)
--------------------------------------------------------------------------------
               |               Robust
         voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
---------------+----------------------------------------------------------------
         treat |  -.1301633   .0011319  -115.00   0.000    -.1323817   -.1279448
   treat_black |   .0294841    .001744    16.91   0.000     .0260659    .0329024
treat_hispanic |  -.0334603   .0042531    -7.87   0.000    -.0417961   -.0251244
 treat_othernw |  -.0237244    .003751    -6.32   0.000    -.0310763   -.0163725
--------------------------------------------------------------------------------

Absorbed degrees of freedom:
-----------------------------------------------------------------+
   Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
---------------+-------------------------------------------------|
            id |            0         6627312        6627312 *   | 
  race_by_year |           24              25              1     | 
-----------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b2 = _b[treat]

. local se2 = _se[treat]

. local b2_2 = _b[treat_black]

. local se2_2 = _se[treat_black]

. local b2_3 = _b[treat_hispanic]

. local se2_3 = _se[treat_hispanic]

. local b2_4 = _b[treat_othernw]

. local se2_4 = _se[treat_othernw]

. local n2 = e(N)

. local nclust2 = e(N_clust)

. 
. * age by year 
. reghdfe voted treat treat_black treat_hispanic treat_othernw, a(id age_by_year) cluster(id)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,089,505
Absorbing 2 HDFE groups                           F(   4,6617900) =    4125.39
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6193
                                                  Adj R-squared   =     0.5241
                                                  Within R-sq.    =     0.0006
Number of clusters (id)      =  6,617,901         Root MSE        =     0.3436

                               (Std. Err. adjusted for 6,617,901 clusters in id)
--------------------------------------------------------------------------------
               |               Robust
         voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
---------------+----------------------------------------------------------------
         treat |  -.0946912   .0011547   -82.00   0.000    -.0969544    -.092428
   treat_black |  -.0206921   .0017312   -11.95   0.000    -.0240852   -.0172991
treat_hispanic |  -.0277926   .0040761    -6.82   0.000    -.0357817   -.0198035
 treat_othernw |  -.0492495   .0036799   -13.38   0.000    -.0564619   -.0420372
--------------------------------------------------------------------------------

Absorbed degrees of freedom:
-----------------------------------------------------------------+
   Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
---------------+-------------------------------------------------|
            id |            0         6617901        6617901 *   | 
   age_by_year |          444             445              1     | 
-----------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b3 = _b[treat]

. local se3 = _se[treat]

. local b3_2 = _b[treat_black]

. local se3_2 = _se[treat_black]

. local b3_3 = _b[treat_hispanic]

. local se3_3 = _se[treat_hispanic]

. local b3_4 = _b[treat_othernw]

. local se3_4 = _se[treat_othernw]

. local n3 = e(N)

. local nclust3 = e(N_clust)

. 
. * age by race by year
. reghdfe voted treat treat_black treat_hispanic treat_othernw, a(id race_by_age_by_year) cluster(id)
(dropped 20 singleton observations)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   = 33,089,485
Absorbing 2 HDFE groups                           F(   4,6617896) =    3708.33
Statistics robust to heteroskedasticity           Prob > F        =     0.0000
                                                  R-squared       =     0.6204
                                                  Adj R-squared   =     0.5255
                                                  Within R-sq.    =     0.0005
Number of clusters (id)      =  6,617,897         Root MSE        =     0.3431

                               (Std. Err. adjusted for 6,617,897 clusters in id)
--------------------------------------------------------------------------------
               |               Robust
         voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
---------------+----------------------------------------------------------------
         treat |  -.1032155   .0011757   -87.79   0.000    -.1055199   -.1009111
   treat_black |    .019983   .0017932    11.14   0.000     .0164684    .0234977
treat_hispanic |  -.0633319    .004268   -14.84   0.000    -.0716972   -.0549667
 treat_othernw |  -.0442654   .0037653   -11.76   0.000    -.0516453   -.0368855
--------------------------------------------------------------------------------

Absorbed degrees of freedom:
----------------------------------------------------------------------+
        Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
--------------------+-------------------------------------------------|
                 id |            0         6617897        6617897 *   | 
race_by_age_by_year |         2179            2180              1     | 
----------------------------------------------------------------------+
* = fixed effect nested within cluster; treated as redundant for DoF computation

. local b4 = _b[treat]

. local se4 = _se[treat]

. local b4_2 = _b[treat_black]

. local se4_2 = _se[treat_black]

. local b4_3 = _b[treat_hispanic]

. local se4_3 = _se[treat_hispanic]

. local b4_4 = _b[treat_othernw]

. local se4_4 = _se[treat_othernw]

. local n4 = e(N)

. local nclust4 = e(N_clust)

. 
. 
. preserve

. 
. 
. collapse (sum) count (mean) voted, by(outcome_path_pretreat no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw election)

. 
. *** get N by path by summing together n treated and n control
. sort outcome_path no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw election

. // get treated units in each bin
. gen tot_tmp = count if no_dmv_match & ///
>         ((no_dmv_match != no_dmv_match[_n-1]) | ///
>         (no_dmv_black != no_dmv_black[_n-1]) | ///
>         (no_dmv_hispanic != no_dmv_hispanic[_n-1]) | ///
>         (no_dmv_othernw != no_dmv_othernw[_n-1]))
(5,221 missing values generated)

. // get treated units in outcome path
. egen tot_treat = sum(tot_tmp), by(outcome_path)

. // get control units in each outcome path
. by outcome_path no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw: replace tot_tmp = count[1] if _n == 1
(341 real changes made)

. // get total units in each outcome path
. egen tot = sum(tot_tmp), by(outcome_path)

. // N_voters is the number of voters who enter into the regression
. egen N_voters = sum(tot_tmp)

. // get number of elections
. unique election
Number of unique values of election is  5
Number of records is  6100

. // N is number of voters * number of elections
. gen long N = N_voters * r(unique)

. drop tot_tmp

. gen tot_control = tot - tot_treat

. 
. *** get weights for fw based on total n per stratum
. *** each stratum has 10 obs
. *** fw requires integers so need to round
. gen tot2 = round(tot/10)

. gen tot_treat2 = round(tot_treat/10)

. egen op = group(outcome_path)

. 
. reghdfe voted no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw [fw=tot_treat2], a(op election)
weight tot_treat2 can only contain strictly positive integers, but 1035 zero values were found (will be dropped)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   =    544,320
Absorbing 2 HDFE groups                           F(   4, 544074) =     309.77
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.6432
                                                  Adj R-squared   =     0.6430
                                                  Within R-sq.    =     0.0023
                                                  Root MSE        =     0.2657

---------------------------------------------------------------------------------
          voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
----------------+----------------------------------------------------------------
   no_dmv_match |  -.0318112   .0011362   -28.00   0.000    -.0340381   -.0295842
   no_dmv_black |  -.0012296   .0011364    -1.08   0.279    -.0034569    .0009977
no_dmv_hispanic |   .0036412   .0011432     3.19   0.001     .0014005    .0058819
 no_dmv_othernw |  -.0005562   .0011374    -0.49   0.625    -.0027854     .001673
----------------+----------------------------------------------------------------
       Absorbed |    F(241, 544074) =   4063.352   0.000             (Joint test)
---------------------------------------------------------------------------------

Absorbed degrees of freedom:
------------------------------------------------------------------+
    Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
----------------+-------------------------------------------------|
             op |          238             238              0     | 
       election |            4               5              1     | 
------------------------------------------------------------------+

. local b5 = _b[no_dmv_match]

. local se5 = _se[no_dmv_match]

. local b5_2 = _b[no_dmv_black]

. local se5_2 = _se[no_dmv_black]

. local b5_3 = _b[no_dmv_hispanic]

. local se5_3 = _se[no_dmv_hispanic]

. local b5_4 = _b[no_dmv_othernw]

. local se5_4 = _se[no_dmv_othernw]

. local n5 = N

. local nclust5 = N_voters

. 
. * match on pre-treatment turnout path and race
. 
. restore

. preserve

. 
. collapse (sum) count (mean) voted, by(outcome_path_pretreat no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw race_string election)

. 
. *** get N by path by summing together n treated and n control
. sort outcome_path no_dmv_match race_string no_dmv_black no_dmv_hispanic no_dmv_othernw election

. // get treated units in each bin
. gen tot_tmp = count if no_dmv_match & ///
>         ((no_dmv_match != no_dmv_match[_n-1]) | ///
>         (no_dmv_black != no_dmv_black[_n-1]) | ///
>         (no_dmv_hispanic != no_dmv_hispanic[_n-1]) | ///
>         (no_dmv_othernw != no_dmv_othernw[_n-1]))
(11,842 missing values generated)

. // get treated units in outcome path and race
. egen tot_treat = sum(tot_tmp), by(outcome_path race_string)

. // get control units in each outcome path by race
. by outcome_path no_dmv_match race_string no_dmv_black no_dmv_hispanic no_dmv_othernw: replace tot_tmp = count[1] if _n == 1
(1,558 real changes made)

. // get total units in each outcome path
. egen tot = sum(tot_tmp), by(outcome_path race_string)

. // N_voters is the number of voters who enter into the regression
. egen N_voters = sum(tot_tmp)

. // get number of elections
. unique election
Number of unique values of election is  5
Number of records is  12855

. // N is number of voters * number of elections
. gen long N = N_voters * r(unique)

. drop tot_tmp

. gen tot_control = tot - tot_treat

. 
. *** get weights for fw based on total n per stratum
. *** each stratum has 10 obs
. *** fw requires integers so need to round
. gen tot2 = round(tot/10)

. gen tot_treat2 = round(tot_treat/10)

. egen op = group(outcome_path race_string)

. 
. reghdfe voted no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw [fw=tot_treat2], a(op election)
weight tot_treat2 can only contain strictly positive integers, but 6905 zero values were found (will be dropped)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   =    218,440
Absorbing 2 HDFE groups                           F(   4, 217837) =     186.03
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.6424
                                                  Adj R-squared   =     0.6415
                                                  Within R-sq.    =     0.0034
                                                  Root MSE        =     0.2667

---------------------------------------------------------------------------------
          voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
----------------+----------------------------------------------------------------
   no_dmv_match |  -.0337741   .0015451   -21.86   0.000    -.0368024   -.0307458
   no_dmv_black |   .0090886   .0024501     3.71   0.000     .0042865    .0138907
no_dmv_hispanic |  -.0049321   .0057795    -0.85   0.393    -.0162598    .0063956
 no_dmv_othernw |  -.0012351   .0052138    -0.24   0.813     -.011454    .0089838
----------------+----------------------------------------------------------------
       Absorbed |    F(598, 217837) =    648.423   0.000             (Joint test)
---------------------------------------------------------------------------------

Absorbed degrees of freedom:
------------------------------------------------------------------+
    Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
----------------+-------------------------------------------------|
             op |          595             595              0     | 
       election |            4               5              1     | 
------------------------------------------------------------------+

. local b6 = _b[no_dmv_match]

. local se6 = _se[no_dmv_match]

. local b6_2 = _b[no_dmv_black]

. local se6_2 = _se[no_dmv_black]

. local b6_3 = _b[no_dmv_hispanic]

. local se6_3 = _se[no_dmv_hispanic]

. local b6_4 = _b[no_dmv_othernw]

. local se6_4 = _se[no_dmv_othernw]

. local n6 = N

. local nclust6 = N_voters

. 
. 
. restore

. 
. 
. collapse (sum) count (mean) voted, ///
>         by(outcome_path_pretreat no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw race_string age_bin election)

. 
. drop if age_bin == . 
(1,755 observations deleted)

. 
. *** get N by path by summing together n treated and n control
. sort outcome_path no_dmv_match race_string age_bin no_dmv_black no_dmv_hispanic no_dmv_othernw election

. // get treated units in each bin
. gen tot_tmp = count if no_dmv_match & ///
>         ((no_dmv_match != no_dmv_match[_n-1]) | ///
>         (no_dmv_black != no_dmv_black[_n-1]) | ///
>         (no_dmv_hispanic != no_dmv_hispanic[_n-1]) | ///
>         (no_dmv_othernw != no_dmv_othernw[_n-1]) | ///
>         (age_bin != age_bin[_n-1]))
(67,256 missing values generated)

. // get treated units in outcome path and race and age bin
. egen tot_treat = sum(tot_tmp), by(outcome_path race_string age_bin)

. // get control units in each outcome path by race and age_bin
. by outcome_path no_dmv_match race_string age_bin no_dmv_black no_dmv_hispanic no_dmv_othernw: replace tot_tmp = count[1] if _n == 1
(9,964 real changes made)

. // get total units in each outcome path race and age bin
. egen tot = sum(tot_tmp), by(outcome_path race_string age_bin)

. // N_voters is the number of voters who enter into the regression
. egen N_voters = sum(tot_tmp)

. // get number of elections
. unique election
Number of unique values of election is  5
Number of records is  71615

. // N is number of voters * number of elections
. gen long N = N_voters * r(unique)

. drop tot_tmp

. gen tot_control = tot - tot_treat

. 
. *** get weights for fw based on total n per stratum
. *** each stratum has 10 obs
. *** fw requires integers so need to round
. gen tot2 = round(tot/10)

. gen tot_treat2 = round(tot_treat/10)

. egen op = group(outcome_path race_string age_bin)

. 
. reghdfe voted no_dmv_match no_dmv_black no_dmv_hispanic no_dmv_othernw [fw=tot_treat2], a(op election)
weight tot_treat2 can only contain strictly positive integers, but 53975 zero values were found (will be dropped)
(converged in 3 iterations)

HDFE Linear regression                            Number of obs   =    209,780
Absorbing 2 HDFE groups                           F(   4, 208008) =     126.34
                                                  Prob > F        =     0.0000
                                                  R-squared       =     0.6374
                                                  Adj R-squared   =     0.6343
                                                  Within R-sq.    =     0.0024
                                                  Root MSE        =     0.2681

---------------------------------------------------------------------------------
          voted |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
----------------+----------------------------------------------------------------
   no_dmv_match |  -.0278959   .0015896   -17.55   0.000    -.0310115   -.0247804
   no_dmv_black |   .0071806   .0025112     2.86   0.004     .0022588    .0121025
no_dmv_hispanic |   -.009544   .0058779    -1.62   0.104    -.0210646    .0019766
 no_dmv_othernw |  -.0046229   .0053768    -0.86   0.390    -.0151612    .0059154
----------------+----------------------------------------------------------------
       Absorbed |   F(1767, 208008) =    204.831   0.000             (Joint test)
---------------------------------------------------------------------------------

Absorbed degrees of freedom:
------------------------------------------------------------------+
    Absorbed FE |  Num. Coefs.  =   Categories  -   Redundant     | 
----------------+-------------------------------------------------|
             op |         1764            1764              0     | 
       election |            4               5              1     | 
------------------------------------------------------------------+

. local b7 = _b[no_dmv_match]

. local se7 = _se[no_dmv_match]

. local b7_2 = _b[no_dmv_black]

. local se7_2 = _se[no_dmv_black]

. local b7_3 = _b[no_dmv_hispanic]

. local se7_3 = _se[no_dmv_hispanic]

. local b7_4 = _b[no_dmv_othernw]

. local se7_4 = _se[no_dmv_othernw]

. local n7 = N 

. local nclust7 = N_voters

. 
. log close
      name:  <unnamed>
       log:  /Users/jesse/Dropbox/voter_id/Replication/table6.log
  log type:  text
 closed on:  17 Aug 2020, 13:21:32
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
